/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package itc.com.co.beans;

import BussinesLogic.UsuarioBL;
import EntidadesCM.RolCM;
import EntidadesCM.UsuarioCM;
import itc.com.co.beans.utils.Constants;
import itc.com.co.beans.utils.FacesUtils;
import itc.com.co.beans.utils.Principal;
import java.io.IOException;
import javax.faces.event.ActionEvent;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Nas
 */
public class LoginBean implements Serializable {

    private static final long serialVersionUID = -2152389656664659476L;
    private String nombre;
    private String clave;
    private boolean logeado = false;
    private boolean isRolAdmin = false;
    private boolean isRolComercial = false;
    private boolean isRolRecepcionista = false;
    private boolean isRolMedico = false;
    private Principal usuario;
    private String nombreusuario;



    public void login(ActionEvent actionEvent){
        try {
            RequestContext context = RequestContext.getCurrentInstance();

            UsuarioCM usuarioCM;
            UsuarioBL usuarioBL = new UsuarioBL();
            usuarioCM = usuarioBL.buscarUsuarioByUsernamePassword(getNombre(), getClave());
            usuario = new Principal();
            if (usuarioCM != null) {
                usuario.setIdUsuario(usuarioCM.getIdUsuario());
                usuario.setNombre(usuarioCM.getNombre() + " " + usuarioCM.getApellido());
                usuario.setUsername(usuarioCM.getUsername());
                nombreusuario = usuarioCM.getNombre() + " " + usuarioCM.getApellido();
                logeado = true;
                setIsRolAdmin(true);
                FacesUtils.addSuccessMessage("Bienvenid@ " + usuario.getNombre());
                FacesContext facesContext = FacesContext.getCurrentInstance();
                validarRoles(usuarioCM.getRolList());
                facesContext.getExternalContext().redirect("./faces/menu.xhtml");
                
            } else {
                logeado = false;
                FacesUtils.addSuccessMessage("Login Error" + "Credenciales no válidas");
            }

            context.addCallbackParam("estaLogeado", isLogeado());
            if (isLogeado()) {
                context.addCallbackParam("view", "login.xhtml");
            }
        } catch (IOException ex) {
            FacesUtils.addSuccessMessage("Login Error" + ex.getMessage());
        }
    }

    public void logout(ActionEvent actionEvent) {
        try {
            FacesUtils.addSuccessMessage("Logged out");

            HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
                    .getExternalContext().getSession(false);
            session.invalidate();
            logeado = false;
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.getExternalContext().redirect("./faces/login.xhtml");
        } catch (IOException ex) {
            Logger.getLogger(LoginBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void volverLogin(ActionEvent e) {
        try {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.getExternalContext().redirect("./faces/login.xhtml");
        } catch (IOException ex) {
            FacesUtils.addSuccessMessage("Login Error" + ex.getMessage());
        }
    }

    public void validarRoles(List<RolCM> roles) {
        isRolAdmin = false;
        isRolComercial = false;
        isRolMedico = false;
        isRolRecepcionista = false;
        
        for (RolCM rol : roles) {
            if (rol.getRol().equalsIgnoreCase(Constants.ROL_ADMIN)) {
                isRolAdmin = true;
            } else if (rol.getRol().equalsIgnoreCase(Constants.ROL_COMERCIAL)) {
                isRolComercial = true;
            } else if (rol.getRol().equalsIgnoreCase(Constants.ROL_RECEPCIONISTA)) {
                isRolRecepcionista = true;
            } else if (rol.getRol().equalsIgnoreCase(Constants.ROL_MEDICO)) {
                isRolMedico = true;
            }
        }

    }

    /**
     * ***************** Getters and Setter *****************
     */
    /**
     * @return the isRolAdmin
     */
    public boolean estaLogeado() {
        return isLogeado();
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getClave() {
        return clave;
    }

    public void setClave(String clave) {
        this.clave = clave;
    }

    public boolean isIsRolAdmin() {
        return isRolAdmin;
    }

    /**
     * @param isRolAdmin the isRolAdmin to set
     */
    public void setIsRolAdmin(boolean isRolAdmin) {
        this.isRolAdmin = isRolAdmin;
    }

    /**
     * @return the logeado
     */
    public boolean isLogeado() {
        return logeado;
    }

    /**
     * @return the usuario
     */
    public Principal getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Principal usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the isRolComercial
     */
    public boolean isIsRolComercial() {
        return isRolComercial;
    }

    /**
     * @param isRolComercial the isRolComercial to set
     */
    public void setIsRolComercial(boolean isRolComercial) {
        this.isRolComercial = isRolComercial;
    }

    /**
     * @return the isRolRecepcionista
     */
    public boolean isIsRolRecepcionista() {
        return isRolRecepcionista;
    }

    /**
     * @param isRolRecepcionista the isRolRecepcionista to set
     */
    public void setIsRolRecepcionista(boolean isRolRecepcionista) {
        this.isRolRecepcionista = isRolRecepcionista;
    }

    /**
     * @return the isRolMedico
     */
    public boolean isIsRolMedico() {
        return isRolMedico;
    }

    /**
     * @param isRolMedico the isRolMedico to set
     */
    public void setIsRolMedico(boolean isRolMedico) {
        this.isRolMedico = isRolMedico;
    }

    /**
     * @return the nombreusuario
     */
    public String getNombreusuario() {
        return nombreusuario;
    }

    /**
     * @param nombreusuario the nombreusuario to set
     */
    public void setNombreusuario(String nombreusuario) {
        this.nombreusuario = nombreusuario;
    }
}